
/**
 * 报数游戏
 * 
 * 题目描述

100个人围成一圈，每个人有一个编码，编号从1开始到100。

他们从1开始依次报数，报到为M的人自动退出圈圈，然后下一个人接着从1开始报数，直到剩余的人数小于M。

请问最后剩余的人在原先的编号为多少？

输入描述
输入一个整数参数 M

输出描述
如果输入参数M小于等于1或者大于等于100，输出“ERROR!”；

否则按照原先的编号从小到大的顺序，以英文逗号分割输出编号字符串

用例
输入	3
输出	58,91
说明	输入M为3，最后剩下两个人。
输入	4
输出	34,45,97
说明	输入M为4，最后剩下三个人。

 */

import java.util.ArrayDeque;
import java.util.Scanner;
import java.util.StringJoiner;

/**
  * 
  题目解析
本题是经典的约瑟夫环问题，约瑟夫环主要是模拟环，这里的环可以使用循环链表，双端队列模拟，也可以基于数组结构，使用特定逻辑模拟环向运动。

但是最简单最通用的还是使用双端队列。

  */
public class 报数游戏 {
    
    public static void main(String[] args) {
    

        try{

            Scanner sc = new Scanner(System.in);
 
            int m = sc.nextInt();
    
            // 如果输入参数M小于等于1或者大于等于100，输出“ERROR!”
            if (m <= 1 || m >= 100) {
                System.out.println("ERROR!");
                return;
            }
    
            // 使用双端队列模拟约瑟夫环
            ArrayDeque<Integer> queue = new ArrayDeque<>();
            for (int id = 1; id <= 100; id++) queue.addLast(id);
    
            int num = 1;
            while (queue.size() >= m) {
                // 编号id的人报数num
                int id = queue.pollFirst();
    
                if (num == m) {
                    num = 1;
                } else {
                    num++;
                    queue.addLast(id);
                }
            }
    
            StringJoiner sj = new StringJoiner(",");
            queue.stream().sorted().forEach(id -> sj.add(id + ""));
    
            System.out.println(sj);


        }catch(Exception e){
            e.printStackTrace();
        }

    }
}
